package com.cuc.platform.core.componet.security;

import java.util.List;
import java.util.Map;

import com.cuc.platform.core.componet.security.domain.SecurityAuthority;
import com.cuc.platform.core.componet.security.domain.SecurityMenu;
import com.cuc.platform.core.componet.security.domain.SecurityUser;
import com.cuc.platform.core.service.ServiceException;

/**
 * @author peepul
 * 
 * 权限验证相关Facade，负责处理与登录及验证权限相关的业务接口
 */
public interface SecurityFacadeService {
	
	/**
	 * 根据登录账号获取用户信息
	 * 
	 * @param loginName
	 * @return SecurityUser
	 */
	public SecurityUser getUserByLoginName(String loginName);

	//--------------------------------------------------------------------------
	
	/**
	 * 根据登录账号获取具有角色集合的用户对象
	 * 
	 * @param userName
	 * @return List
	 */
	public List<Map<String, Object>> getUserWithRoles(String userName);
	
	/**
	 * 根据角色主键获取权限对象集合
	 * 
	 * @param roleId
	 * @return List
	 */
	public List<SecurityAuthority> getAuthsByRoleId(Long roleId);
	
	/**
	 * 修改密码
	 * 
	 * @param plainPassword 明文密码
	 */
	public void updatePassword(SecurityUser user) throws ServiceException;
	
	/**
	 * 刷新角色权限与资源的关联关系，不重启系统即可实现动态权限的分配
	 */
	public void refreshAuthResc();
	
	/**
	 * 根据用户账号，获取其对应的菜单项
	 * 
	 * 注：根据账号获取角色，再根据角色获取对应的菜单项。
	 *     由于用户、角色、菜单都是多对多的对应关系，需要过滤掉重复的菜单数据
	 *     
	 * @param userName 登录账号
	 * @return List<SecurityMenu> 包含所有该用户对应的菜单项，不分层次级别
	 */
	public List<SecurityMenu> listMenuByUser(String userName);
	
	/**
	 * 根据用户账号，获取其对应的某一层次级别的菜单项
	 * 
	 * 注：本方法是为方便使用而设定。
	 *     在listMenuByUser(String userName)返回的结果集之上，进一步获取指定层次级别的菜单项
	 *     
	 * @param userName 登录账号
	 *        level    菜单层次级别
	 *        
	 * @return List<SecurityMenu> 包含所有该用户对应的某一级别的菜单项集合
	 */
	public List<SecurityMenu> listMenuByUserWithLevel(String userName, Integer level);

}
